package com.feng.thread.concurrent;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * Executor执行Runnable任务 调用该实例的execute（Runnablecommand）方法即可。
 * 一旦Runnable任务传递到execute（）方法，该方法便会自动在一个线程上执行
 * 
 * @author Qian
 *
 */
public class ExecutorsDemo {

	public static void main(String[] args) {
		/**
		 * 缓存型池子，先查看池中有没有以前建立的线程，如果有，就reuse.如果没有，就建一个新的线程加入池中,
		 * 常用于执行一些生存期很短的异步型任务.
		 */
		ExecutorService executor = Executors.newCachedThreadPool();
		/**
		 * newFixedThreadPool与cacheThreadPool差不多，也是能reuse就用，但不能随时建新的线程,
		 * 其独特之处:任意时间点，最多只能有固定数目的活动线程存在，此时如果有新的线程要建立，只能放在另外的队列中等待，
		 * 直到当前的线程中某个线程终止直接被移出池子
		 */
		// ExecutorService executor = Executors.newFixedThreadPool(10);
		for (int i = 0; i < 7; i++) {
			executor.execute(new testRunnable());// 执行线程
			System.out.println("------------" + i + "---------------");
		}
		executor.shutdown();// 关闭
	}
}

class testRunnable implements Runnable {

	@Override
	public void run() {
		System.err.println(Thread.currentThread().getName() + "hahahhahhahahah");

		/**
		 * 结果：某线程被执行多次：
		 * execute会首先在线程池中选择一个已有空闲线程来执行任务，如果线程池中没有空闲线程，它便会创建一个新的线程来执行任务
		 */
	}

}
